// 版权所有2011 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package types

// BasicKind描述了基本类型的类型。
type BasicKind int

const (
	Invalid BasicKind = iota // 类型无效

	// 预声明的类型
	Bool
	Int
	Int8
	Int16
	Int32
	Int64
	Uint
	Uint8
	Uint16
	Uint32
	Uint64
	Uintptr
	Float32
	Float64
	Complex64
	Complex128
	String
	UnsafePointer

	// 非类型化值的类型
	UntypedBool
	UntypedInt
	UntypedRune
	UntypedFloat
	UntypedComplex
	UntypedString
	UntypedNil

	// 别名
	Byte = Uint8
	Rune = Int32
)

// 基本信息是描述基本类型属性的一组标志。
type BasicInfo int

// 基本类型的属性。
const (
	IsBoolean BasicInfo = 1 << iota
	IsInteger
	IsUnsigned
	IsFloat
	IsComplex
	IsString
	IsUntyped

	IsOrdered   = IsInteger | IsFloat | IsString
	IsNumeric   = IsInteger | IsFloat | IsComplex
	IsConstType = IsBoolean | IsNumeric | IsString
)

// Basic表示基本类型。
type Basic struct {
	kind BasicKind
	info BasicInfo
	name string
}

// Kind返回基本类型b的类型。
func (b *Basic) Kind() BasicKind { return b.kind }

// Info返回基本类型b的属性信息。
func (b *Basic) Info() BasicInfo { return b.info }

// Name返回基本类型b的名称。
func (b *Basic) Name() string { return b.name }

func (t *Basic) Underlying() Type { return t }
func (t *Basic) String() string   { return TypeString(t, nil) }
